home *** CD-ROM | disk | FTP | other *** search
- unit DrBobEml;
- interface
- uses
- Classes, ScktComp;
-
- type
- TBSMTP = class(TComponent)
- public
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- public
- procedure SendMail;
- protected
- _Socket: TClientSocket;
- Step: Integer;
- procedure SocketRead(Sender: TObject; Socket: TCustomWinSocket);
- procedure SocketWrite(Sender: TObject; Socket: TCustomWinSocket);
- private
- fMailServer: String;
- fMessageTo: String; { only one "To" at a time }
- fMessageFrom: String;
- fMessageSubject: String;
- fMessageText: TStringList; { assign to TMemo.Lines for example }
- procedure SetMessageText(NewText: TStringList);
- published
- property MailServer: String read fMailServer write fMailServer;
- property MessageTo: String read fMessageTo write fMessageTo;
- property MessageFrom: String read fMessageFrom write fMessageFrom;
- property MessageSubject: String read fMessageSubject write fMessageSubject;
- property MessageText: TStringList read fMessageText write SetMessageText;
- end;
-
- implementation
- uses
- SysUtils, Forms; { for the Application.ProcessMessages-loop }
-
- constructor TBSMTP.Create(AOwner: TComponent);
- begin
- inherited Create(AOwner);
- _Socket := TClientSocket.Create(Self);
- _Socket.Port := 25; // according to RFC 821
- _Socket.OnRead := SocketRead;
- _Socket.OnWrite := SocketWrite;
- Step := 0;
- fMessageText := TStringList.Create
- end {Create};
-
- destructor TBSMTP.Destroy;
- begin
- fMessageText.Free;
- _Socket.Free;
- _Socket := nil;
- inherited Destroy
- end {Destroy};
-
- procedure TBSMTP.SetMessageText(NewText: TStringList);
- begin
- fMessageText.Assign(NewText)
- end {SetMessageText};
-
- procedure TBSMTP.SocketRead(Sender: TObject; Socket: TCustomWinSocket);
- var
- Status: String;
- begin
- Status := Socket.ReceiveText;
- SocketWrite(Sender, Socket)
- end {SocketRead};
-
- procedure TBSMTP.SocketWrite(Sender: TObject; Socket: TCustomWinSocket);
- const
- CRLF = #13#10;
- var
- i: Integer;
- Send: String;
- begin
- Inc(Step);
- case Step of
- 1: Send := 'HELO ' + fMessageFrom;
- 2: Send := 'MAIL FROM:' + fMessageFrom;
- 3: Send := 'RCPT TO:' + fMessageTo; { captain }
- 4: Send := 'DATA';
- 5: begin
- Socket.SendText('From: ' + fMessageFrom + CRLF);
- Socket.SendText('To: ' + fMessageTo + CRLF);
- Socket.SendText('Subject: ' + fMessageSubject + CRLF + CRLF);
- for i:=0 to Pred(fMessageText.Count) do
- begin
- Send := fMessageText[i];
- Socket.SendText(Send + CRLF)
- end;
- Send := '.'
- end;
- 6: Send := 'QUIT'
- end;
- Socket.SendText(Send + CRLF)
- end {SocketWrite};
-
- procedure TBSMTP.SendMail;
- begin
- Step := 0;
- _Socket.Active := False;
- _Socket.Host := fMailServer;
- _Socket.Open;
- repeat
- { need to rewrite this using low-level Windows APIs }
- Application.ProcessMessages
- until Step > 6 { QUIT }
- end {SendMail};
-
- end.
-